/* ============================================================
 * This code is part of the "apex-lang" open source project avaiable at:
 * 
 *      http://code.google.com/p/apex-lang/
 *
 * This code is licensed under the Apache License, Version 2.0.  You may obtain a 
 * copy of the License at:
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * ============================================================
 */
global class BooleanUtils {

	global static Boolean isFalse(Boolean bool)
	{
		if(bool==null)
			return false;
		else
			return !bool;
	}
	
	global static Boolean isNotFalse(Boolean bool)
	{
		if(bool==null)
			return true;
		else
			return bool;
	}
	
	global static Boolean isNotTrue(Boolean bool)
	{
		if(bool==null)
			return true;
		else
			return !bool;
	}
	
	global static Boolean isTrue(Boolean bool)
	{
		if(bool==null)
			return false;
		else
			return bool;
	}
	
	global static Boolean negate(Boolean bool)
	{
		if(bool==null)
			return null;
		else
			return !bool;
	}
	
	global static Boolean toBooleanDefaultIfNull(Boolean bool, Boolean defaultVal)
	{
		if(bool==null)
			return defaultVal;
		else
			return bool;
	}
	
	global static Boolean toBoolean(Integer value)
	{
		if(value==null)
			return false;
		else
		{
			if(value==0)
				return false;
			else
				return true;
		}
	}
	
	global static Boolean strToBoolean(String value)
	{
		if(value==null)
			return false;
		else
		{
			if(StringUtils.equalsIgnoreCase(value,'true'))
				return true;
			else
				return false;
		}
	}
	
	/************************************/
	//Converts an int to a boolean specifying 
	//the conversion values.
	//    Parameters:
    //    value - the Integer to convert, may be null
    //    trueValue - the value to match for true, may be null
    //    falseValue - the value to match for false, may be null 
    //Returns:
    //    true or false 
    //Throws:
    //    java.lang.IllegalArgumentException - if no match
	/************************************/
	global static Boolean toBoolean(Integer value,
									Integer trueValue,
									Integer falseValue)
	{
		if(value==trueValue)
			return true;
		else if(value==falseValue)
			return false;
		else
			throw new IllegalArgumentException();
	}
	
	
	global static Integer toInteger(Boolean bool)
	{
		if(bool==null)
			throw new IllegalArgumentException();
		else
		{
			if(bool)
				return 1;
			else
				return 0;
		}
	}
	
	
	global static String toStringYesNo(Boolean bool)
	{
		if(bool==null)
			return null;
		else
		{
			if(bool)
				return 'yes';
			else
				return 'no';
		}
	}
	
	global static String toStringYN(Boolean bool)
	{
		if(bool==null)
			return null;
		else
		{
			if(bool)
				return 'Y';
			else
				return 'N';
		}
	}
	
	
	global static String toString(Boolean bool,
								  String trueString,
								  String falseString)
	{
		if(bool==null)
			return null;		
		else
		{
			if(bool)
				return trueString;
			else
				return falseString;
		}
	}
	
	global static Boolean xor(Boolean[] boolArray)
	{
		if(boolArray==null || boolArray.size()==0)
			throw new IllegalArgumentException();
		else
		{
			Boolean firstItem=boolArray[0];
			for(Boolean bool:boolArray)
			{
				if(bool!=firstItem)
					return false;
			}
			return true;
		}	
	} 

}